package chapter02.part02;

import chapter02.FileUtil;

import java.io.*;

/**
 * 以二进制读写数据 比文本高效
 * 对于给定类型的值 使用的空间都是相同的 读取比解析文本更快
 * 
 * @author insight
 * @since 2021/8/13
 */
public class DataInOutput {
    public static void main(String[] args) throws IOException {
        // DataInput & DataOutput 接口定义了用于二进制读写的方法
        DataOutput dos =
                new DataOutputStream(FileUtil.getTestFileOutputStreamInstance());
        // 不管这个整数有多少位 总是以4字节写出
        dos.writeInt(4);
        // double 同理 8字节
        // 不同处理器存储整数和浮点数的方法不同
        // Java 采用的是高位在前 独立于凭他
        dos.writeDouble(123.01);
        
        // 使用修订版的8位 unicode 格式写出
        // 为了兼容 unicode 没有超过16位时创建的虚拟机
        // 没有其他方法使用这种修订的编码
        // 简单来说 只有用于 jvm 时才使用此方法
        dos.writeUTF("123");
        // 正常情况使用 writeChars
        dos.writeChars("123");

        DataInput dis =
                new DataInputStream(FileUtil.getTestFileInputStreamInstance());
        // ret: 4
        System.out.println(dis.readInt());
        // ret: 123.01
        System.out.println(dis.readDouble());
        System.out.println(dis.readUTF());
        // 没有对应的 readChars()
        System.out.println(readChars(dis, 3));
    }

    public static String readChars(DataInput dis, int len) throws IOException {
        StringBuilder ret = new StringBuilder();
        for (int i = 0; i < len; i++) {
            ret.append(dis.readChar());
        }
        return ret.toString();
    }
}